package com.ruoyi.common.utils.format;

import java.time.Duration;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class TimeUtils {
    /**
     * 判断两个时间字符串是否在同一小时内
     * 支持不同格式：
     *   - 14位：yyyyMMddHHmmss
     *   - 12位：yyyyMMddHHmm
     */
    public static boolean isSameHour(String timeStr1, String timeStr2) {
        DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
        DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyyMMddHHmm");

        LocalDateTime t1 = parseTime(timeStr1, formatter1);
        LocalDateTime t2 = parseTime(timeStr2, formatter2);

        if (t1 == null || t2 == null) {
            return false; // 格式错误或无法解析
        }

//        Boolean year = t1.getYear() == t2.getYear();
//        Boolean month = t1.getMonthValue() == t2.getMonthValue();
//        Boolean day = t1.getDayOfMonth() == t2.getDayOfMonth();
//        Boolean hour = t1.getHour() == t2.getHour();
//        Boolean hour1 = isWithinOneHour(timeStr1, timeStr2);
        return t1.getYear() == t2.getYear()
            && t1.getMonthValue() == t2.getMonthValue()
            && t1.getDayOfMonth() == t2.getDayOfMonth()
            &&  isWithinOneHour(timeStr1, timeStr2);
    }

    /**
     * 判断两个时间是否在“同一小时内”，允许相差不超过 1 小时
     */
    public static boolean isWithinOneHour(String timeStr1, String timeStr2) {
        DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
        DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyyMMddHHmm");

        LocalDateTime t1 = parseTime(timeStr1, formatter1);
        LocalDateTime t2 = parseTime(timeStr2, formatter2);

        if (t1 == null || t2 == null) {
            return false;
        }

        return Duration.between(t1, t2).abs().getSeconds() <= 3600;
    }

    private static LocalDateTime parseTime(String timeStr, DateTimeFormatter formatter) {
        try {
            return LocalDateTime.parse(timeStr, formatter);
        } catch (Exception e) {
            // 新增对 "yyyy-MM-dd HH:mm:ss" 的支持
            try {
                DateTimeFormatter newFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
                return LocalDateTime.parse(timeStr, newFormatter);
            } catch (Exception ex) {
                System.err.println("时间解析失败: " + timeStr);
                return null;
            }
        }
//        try {
//            return LocalDateTime.parse(timeStr, formatter);
//        } catch (Exception e) {
//            System.err.println("时间解析失败: " + timeStr);
//            return null;
//        }
    }

    /**
 * 格式化时间戳字符串为标准日期时间格式
 * 该方法旨在处理两种常见的时间戳格式：10位（秒）和13位（毫秒），并将其转换为人类可读的日期时间格式
 *
 * @param timestampStr 时间戳字符串，可以是10位或13位数字
 * @return 格式化后的日期时间字符串，格式为"yyyy-MM-dd HH:mm:ss"
 */
public static String formatTimestamp(String timestampStr) {
    try {
        // 移除时间戳字符串两端的空白字符
        timestampStr = timestampStr.trim();
        long timestamp;
        // 根据时间戳长度判断是秒格式还是毫秒格式
        if (timestampStr.length() == 10) {
            // 如果是10位时间戳，转换为毫秒格式
            timestamp = Long.parseLong(timestampStr) * 1000L; // 秒转毫秒
        } else if (timestampStr.length() == 13) {
            // 如果是13位时间戳，直接使用
            timestamp = Long.parseLong(timestampStr); // 直接使用毫秒
        } else {
            // 如果时间戳长度既不是10位也不是13位，抛出异常
            throw new IllegalArgumentException("无效的时间戳长度");
        }

        // 将时间戳转换为本地日期时间对象
        LocalDateTime dateTime = LocalDateTime.ofInstant(
                java.time.Instant.ofEpochMilli(timestamp),
                java.time.ZoneId.systemDefault()
        );

        // 返回格式化后的日期时间字符串
        return dateTime.format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
    } catch (Exception e) {
        // 异常处理：打印错误信息并返回null
        System.err.println("时间转换失败：" + timestampStr);
        return null;
    }
}



    public static String formatStandard(String timeStr) {
        if (timeStr.length() == 12) {
            return timeStr.substring(0, 4) + "-" + timeStr.substring(4, 6) + "-" +
                timeStr.substring(6, 8) + " " + timeStr.substring(8, 10) + ":" +
                timeStr.substring(10, 12) + ":00";
        }
        return timeStr; // 默认返回原值或做其他处理
    }

    public static String formatStandardWithOneHourAdded(String timeStr) {
        if (timeStr == null || timeStr.isEmpty()) {
            System.err.println("时间解析失败: 输入为空");
            return null;
        }

        if (timeStr.length() == 12) {
            try {
                DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("yyyyMMddHHmm");
                DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

                LocalDateTime parsed = LocalDateTime.parse(timeStr, inputFormatter);
                LocalDateTime plusOneHour = parsed.plusHours(1);

                return plusOneHour.format(outputFormatter);
            } catch (Exception e) {
                System.err.println("时间解析失败: " + timeStr);
                return null;
            }
        } else {
            System.err.println("时间解析失败: 不支持的格式（需为12位时间字符串）");
            return null;
        }
    }

}
